package com.gosophiaigit.contact.busi.service;

import java.util.List;
import java.util.Map;

import com.gosophiaigit.contact.busi.entity.Contact;
import com.gosophiaigit.contact.busi.entity.ContactGroup;

public interface IContactGroupService {

	/**
	 * 新增组（用户组、个人组）
	 * @param group -- 组实体，不能为null
	 */
	public void addContactGroup(ContactGroup group);

	/**
	 * 修改组（用户组、个人组）
	 * @param group -- 组实体，不能为null
	 */
	public void updateContactGroup(ContactGroup group);

	/**
	 * 删除组（用户组、个人组）
	 * @param groupId -- 组Id
	 * @return true成功，false不成功
	 */
	public boolean deleteContactGroup(Long groupId);
	
	/**
	 * 添加修改公共组判断组名是否重复
	 * @param groupId -- 组Id，为null判断添加，不为null判断修改
	 * @param groupName -- 组名称，不可为null
	 * @return true 重复，false不重复
	 */
	public boolean exitPublicGroupName(Long groupId, String groupName);

	/**
	 * 添加修改个人组判断组名是否重复
	 * @param groupId -- 组Id,为null判断添加，不为null判断修改
	 * @param groupName -- 组名称，不可为空
	 * @param contactId -- 联系人Id
	 * @return true 重复，false不重复
	 */
	public boolean exitPrivateGroupName(Long groupId, String groupName,
			Long contactId);
	
	/**
	 * 通过组ID获得到组（用户组、个人组）
	 * @param contactGroupId -- 组Id，不能为null
	 * @return contactGroup 若没有返回 null
	 */
	public ContactGroup findContactGroupById(Long contactGroupId);
	
	/**
	 * 根据组类型查询组列表以及每个组包含的用户个数
	 * 
	 * @param userInfoId -- 用户Id，查询公共组列表可以为null，查询个人组列表不能为null
	 * @param userAccountId -- 登录账号Id，不能为null
	 * @param groupType -- 组类型 ContactGroup.PUBLIC_GROUP,ContactGroup.PRIVATE_GROUP
	 * @return list -- 组列表
	 */
	public List<ContactGroup> findGroupListByGroupType(Long userInfoId,
			Long userAccountId, Long groupType);
	
	/**
	 * 查询所有联系人列表（古智接口）
	 * @return list -- 所有联系人列表
	 */
	public List<Contact> findAllContactList();
	
	/**
	 * 根据组ID查询查询该组下的所有联系人
	 * @param contactGroupId --当前组Id，不能为null
	 * @param userAccountId --当前登录用户Id，不能为null
	 * @return list -- 联系人列表
	 */
	public List<Contact> findContactByContactGroupId(Long contactGroupId,
			Long userAccountId);
	
	/**
	 * 查询最近联系人列表
	 * @param userInfoId -- 用户Id，不能为null
	 * @return list -- 联系人列表
	 */
	public List<Contact> findContactRecordCountList(Long userInfoId,
			Long userAccountId);
	
	/**
	 * 查询所有的联系人(带有权限控制)
	 * @param userAccountId --当前登录账户Id,不能为null,用于通讯录权限判断
	 * @return list --无权限返回所有启用用户
	 */
	public List<Contact> findContactList(Long userAccountId);
	
	/**
	 * 添加联系人到指定组中
	 * @param contactList --联系人 contact集合
	 * @param contactGroup --联系人所在的组 contactGroup
	 */
	public void addContactToGroup(List<Contact> contactList,ContactGroup contactGroup);

	/**
	 * 从指定组中移除联系人
	 * @param contactList -- 联系人 contact集合，不能为Null
	 * @param contactGroup -- 联系人所在的组 ，不能为Null
	 */
	public void removeContactFromGroup(List<Contact> contactList,ContactGroup contactGroup);
	
	/**
	 * 移动联系人到指定组中
	 * @param sourceGroup -- 当前组
	 * @param contact -- 联系人
	 * @param targetGroup -- 目标组
	 */
	public void romoveContactToGroup(ContactGroup sourceGroup,List<Contact> contactList,ContactGroup targetGroup);
	

	
	/**
	 * 得到当前用户所在的个人组，和所有的公共组
	 * @param userInfoId -- 当前用户ID
	 * @param userAccountId -- 当前登录账号ID
	 * return map -- 个人组和公共组map对象
	 */
	public Map<String, List<ContactGroup>> getAllContactGroupByCurrentUserId(Long userInfoId,Long userAccountId);
	
	/** 以下查询合并 */
	/**
	 * 查询最近联系人模糊查询方法
	 * @param userInfoId -- 用户ID，不能为空
	 * @param contactQuery -- 模糊查询条件
	 * @param queryType -- 查询类型，01普通模糊查询 02按首字母模糊查询，不能为空
	 * @param userAccountId -- 当前登录账户ID,不能为空，通讯录权限使用
	 * @return list -- 查询得到的联系人列表
	 */
	public List<Contact> findContactRecordCountList(Long userInfoId,String contactQuery,
			String queryType,Long userAccountId);
	
	/**
	 * 查询所有的联系人模糊查询方法
	 * @param contactQuery -- 查询条件
	 * @param queryType -- 01所有用户组普通模糊查询02所有用户组按首字母模糊查询
	 * @param userAccountId -- 当前登录账户ID,不能为空
	 * @return list -- 联系人列表
	 */
	public List<Contact> findUserInfoList(String contactQuery,String queryType,Long userAccountId);
	
	/**
	 * 根据组ID查询查询该组下的所有联系人模糊查询方法
	 * @param contactGroupId -- 组ID,不能为空
	 * @param contactQuery --- 查询条件
	 * @param queryType -- 01普通用户组模糊查询02普通用户组按首字母模糊查询
	 * @param userAccountId -- 当前登录账户ID,不能为空
	 * @return list -- 联系人列表
	 */
	public List<Contact> findContactByContactGroupId(Long contactGroupId,String contactQuery,String queryType,Long userAccountId);
}
